package com.ilikesoup.instant.split;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * 结合工具类
 * 将多个同类型（或元素为同类型）的对象结合
 * 注意：该类的方法会改变元素的状态
 */
public class JoinUtils {

    /**
     * 将两个包含同类型元素的集合合并后返回。
     * 如果两个集合都非空，那么让第二个集合加入到第一个集合的后面，并返回第一个集合。
     */
    public static <T extends Collection<E>, E> T join(T o1, T o2) {
        if(o1 == null) {
            return o2;
        }
        if(o2 == null) {
            return o1;
        }
        o1.addAll(o2);
        return o1;
    }

    /**
     * 让第一个集合“吃掉”第二个集合的数据。
     * 一人吃掉一个，必须提供充足的食物。第二个集合的数据长度要大于第一个集合的长度。
     */
    public static <T, E> void eat(List<T> men, List<E> foods, BiConsumer<T, E> eating) {
        if(men.size() < foods.size()) {
            return;
        }
        for (int i = 0; i < men.size(); i++) {
            eating.accept(men.get(i), foods.get(i));
        }
    }

    /**
     * 让第一个集合从Map中找到项并吃掉
     */
    public static <T, K ,V> void chooseAndEat(List<T> men, Map<K, V> foods, Function<T, K> choose, BiConsumer<T, V> eating) {
        if(foods.isEmpty()) {
            return;
        }
        K one;
        for (T man : men) {
            one = choose.apply(man);
            eating.accept(man, foods.get(one));
        }
    }

}
